package cn.net.Thread;
/*需求:设计多线程编程模型,4个窗口共计售票100张*/
/*本类通过继承Thread类的方式实现多线程售票案例*/
public class TicketsExtends1 {
    public static void main(String[] args) {
        //9.创建多个线程对象
        TicketThread1 t1 = new TicketThread1();
        TicketThread1 t2 = new TicketThread1();
        TicketThread1 t3 = new TicketThread1();
        TicketThread1 t4 = new TicketThread1();
        //10.start()启动方式
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
//1.自定义线程售票业务类//extends Thread
class TicketThread1 extends Thread{
    //3.定义变量,用来保存票数
    //int tickets=100;不可以这样定义,会卖400张票

    static int tickets = 100;
    /**3、静态资源属于类资源,被全局所有对象共享,只有一份
    解决4个线程卖了400张票的办法**/

    @Override //4.把业务写在重写run()方法里执行
    public void run() {
       while(true){//5.采用while循环来买票，但要注意死循环
           try {
               //6.如果数据能够经受住sleep的考验,才能说明数据没有了安全隐患--人为制造问题
               //问题1:产生了重卖:同一张票卖给了多个人
               //问题2:产生了超卖:超出了规定票数,甚至卖出了0和-1这样的票数
               Thread.sleep(10);/**6.休眠，检测安全隐患**/
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
           System.out.println(getName()+"="+tickets--);//线程名称=票数
           //7.做判断,如果没有票了,就退出死循环
           if(tickets <= 0)
           break;//8.,死循环一定要设置出口
       }

    }
}
/*
Thread-2=0
Thread-0=-1
 */